import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QMenuBar, QAction
from player import 音频播放器
from ui.playlist import 歌曲列表组件
from ui.controls import 控制面板组件
from network.lyrics import 歌词获取器
from network.cloud import 云同步管理
from network.voice import 语音助手Service
from extensions.biometric_auth import 生物识别认证
from family.user_manager import 家庭成员管理
from core.interfaces import 播放器接口, 网络服务接口, 家长控制接口
import gettext

# 初始化国际化支持
def _(text):
    return text  # 默认无翻译

class FavoriteItem:
    def __init__(self, song_name, artist, timestamp):
        self.song_name = song_name
        self.artist = artist
        self.timestamp = timestamp


class 儿歌播放器(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(_('儿歌播放器'))
        self.setGeometry(100, 100, 800, 600)
        
        # 初始化核心组件
        self.初始化界面()
        
        # 初始化高级功能模块
        self.生物识别 = 生物识别认证(self)
        self.家庭管理 = 家庭成员管理(self)
        
        # 初始化媒体播放器
        self.播放器 = 音频播放器()
        
        # 初始化网络服务
        self.歌词服务 = 歌词获取器()
        self.云同步 = 云同步管理()
        
        # 初始化语音助手
        self.语音助手 = 语音助手Service()
        
        # 设置家长控制
        if isinstance(self.播放器, 家长控制接口):
            self.播放器.家长控制.设置时间限制(1800)  # 默认30分钟时间限制
            
        # 加载用户配置
        self.加载用户配置()
        
        # 创建主布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 添加歌曲列表组件
        self.歌曲列表 = 歌曲列表组件()
        layout.addWidget(self.歌曲列表)
        
        # 添加控制面板组件
        self.控制面板 = 控制面板组件()
        layout.addWidget(self.控制面板)
        
        # 连接信号
        self.歌曲列表.itemDoubleClicked.connect(self.选择歌曲)
        self.控制面板.播放_clicked.connect(self.播放歌曲)
        self.控制面板.pause_clicked.connect(self.暂停歌曲)
        self.控制面板.stop_clicked.connect(self.停止歌曲)
        self.控制面板.volume_changed.connect(self.调整音量)
        self.控制面板.mode_changed.connect(self.设置播放模式)
        self.控制面板.skin_changed.connect(self.应用皮肤)
    
    def 加载示例歌曲(self):
        """加载示例歌曲到列表中"""
        示例歌曲 = [_("小星星.mp3"), _("两只老虎.mp3"), _("小兔子乖乖.mp3")]
        for 歌曲 in 示例歌曲:
            self.歌曲列表.addItem(歌曲)
        
    def 切换语言(self, lang_code):
        """切换应用程序语言"""
        try:
            # 加载对应语言的翻译文件
            if lang_code == 'en':
                # 英文翻译
                trans = gettext.NullTranslations()
            else:
                # 中文默认不需要翻译
                trans = gettext.NullTranslations()
            
            trans.install()
            global _
            _ = trans.gettext
            
            # 重新设置界面文本
            self.retranslateUi()
            print(f'成功切换到{lang_code}语言')
        except Exception as e:
            print(f'语言切换失败: {e}')
    
    def retranslateUi(self):
        """重新翻译界面元素"""
        # 更新窗口标题
        self.setWindowTitle(_('QQ儿歌播放器'))
        
        # 更新控制面板文本
        self.控制面板.播放按钮.setText(_('播放'))
        self.控制面板.暂停按钮.setText(_('暂停'))
        self.控制面板.停止按钮.setText(_('停止'))
        self.控制面板.模式选择.clear()
        self.控制面板.模式选择.addItems([_('列表循环'), _('单曲循环'), _('随机播放')])
        self.控制面板.皮肤标签.setText(_('界面主题:'))
        
        # 更新菜单栏
        menu_bar = self.menuBar()
        if menu_bar:
            for action in menu_bar.actions():
                if action.text() == '界面':
                    action.setText(_('界面'))
        
        # 更新播放列表中的示例歌曲名称（如果需要）
        for i in range(self.歌曲列表.count()):
            item = self.歌曲列表.item(i)
            # 由于我们不能直接修改原始中文文件名，这里仅更新显示文本
            original_text = item.text()
            if "小星星" in original_text:
                item.setText(_("小星星.mp3"))
            elif "两只老虎" in original_text:
                item.setText(_("两只老虎.mp3"))
            elif "小兔子乖乖" in original_text:
                item.setText(_("小兔子乖乖.mp3"))
        
    @调试监控.开始计时
    def 选择歌曲(self, item):
        歌曲名称 = item.text()
        歌曲路径 = os.path.join("resources", 歌曲名称)
        if os.path.exists(歌曲路径):
            self.媒体播放器.加载歌曲(歌曲路径)
            logging.info(f"正在加载歌曲: {歌曲路径}")  # 新增日志记录
        else:
            logging.error(f"文件不存在: {歌曲路径}")  # 新增日志记录
    
    def 调整音量(self, value):
        self.媒体播放器.setVolume(value)
        self.音量标签.setText(f'音量: {value}%')
    
    def 设置播放模式(self, index):
        self.当前播放模式 = index
    
    @调试监控.开始计时
    def 播放歌曲(self):
        if self.媒体播放器.mediaStatus() == QMediaPlayer.LoadedMedia:
            self.媒体播放器.play()
            self.媒体播放器.歌词开始时间 = self.媒体播放器.position()
            # 根据播放模式设置播放列表逻辑
            if self.当前播放模式 == 1:  # 单曲循环
                self.媒体播放器.positionChanged.connect(self.检查结束)
    
    def 检查结束(self, position):
        if position >= self.媒体播放器.duration() - 1000:  # 提前1秒切换
            self.媒体播放器.play()
    
    def 暂停歌曲(self):
        """暂停播放"""
        self.媒体播放器.pause()
    
    def 停止歌曲(self):
        """停止播放"""
        self.媒体播放器.stop()
        self.当前歌词索引 = 0
    
    def 设置播放位置(self, position):
        """设置播放位置"""
        self.媒体播放器.setPosition(position)
    
    def 加载歌词(self, 歌曲名称):
        """加载并解析歌词文件"""
        歌词路径 = os.path.splitext(歌曲名称)[0] + ".lrc"
        if not os.path.exists(歌词路径):
            歌词路径 = os.path.join("resources", os.path.splitext(歌曲名称)[0] + ".lrc")
            
        if os.path.exists(歌词路径):
            try:
                with open(歌词路径, 'r', encoding='utf-8') as f:
                    内容 = f.readlines()
                
                # 解析歌词
                self.当前歌词 = []
                self.时间戳列表 = []
                
                for 行 in 内容:
                    行 = 行.strip()
                    if not 行 or 行.startswith('★'):
                        continue
                    
                    # 简单解析带时间戳的歌词
                    if 行.startswith('['):
                        try:
                            # 提取时间戳 [mm:ss.xx]
                            时间部分 = 行[1:6]
                            分, 秒 = map(float, 时间部分.split(':'))
                            时间戳 = int(分 * 60 + 秒) * 1000  # 转换为毫秒
                        
                            # 提取歌词内容
                            歌词内容 = 行[8:]
                            if 歌词内容:
                                self.时间戳列表.append(时间戳)
                                self.当前歌词.append(歌词内容)
                        except:
                            continue
                    else:
                        # 无时间戳歌词
                        self.当前歌词 = []
                        self.时间戳列表 = []
                        break
                
                # 如果没有有效歌词，则使用默认提示
                if not self.当前歌词:
                    self.当前歌词 = [f"《{os.path.splitext(歌曲名称)[0]}》", "无可用歌词"]
                    self.时间戳列表 = []
            except Exception as e:
                print(f"加载歌词失败: {e}")
                self.歌词标签.setText("加载歌词失败")
                self.当前歌词 = ["加载歌词失败"]
                self.时间戳列表 = []
        else:
            self.当前歌词 = [f"《{os.path.splitext(歌曲名称)[0]}》", "无歌词文件"]
            self.时间戳列表 = []
        
        self.当前歌词索引 = 0
        self.更新歌词()
    
    def 更新歌词(self):
        """更新显示的歌词"""
        if hasattr(self, '当前歌词') and self.当前歌词:
            if self.当前歌词索引 < len(self.当前歌词):
                self.歌词标签.setText(self.当前歌词[self.当前歌词索引])
                self.当前歌词索引 += 1
                
                # 计算下一句歌词延迟时间
                if self.当前歌词索引 < len(self.时间戳列表):
                    下一句时间 = self.时间戳列表[self.当前歌词索引] - self.时间戳列表[self.当前歌词索引 - 1]
                else:
                    下一句时间 = 3000  # 默认3秒
                
                self.歌词定时器 = QTimer.singleShot(下一句时间, self.更新歌词)
        # 如果到达最后一句歌词，返回开头
        if self.当前歌词索引 >= len(self.当前歌词):
            self.歌词标签.setText(_('暂无歌词'))
    
    def 更新进度条(self, position):
        """更新进度条位置"""
        self.进度条.setValue(position)
        
    def 更新按钮状态(self, state):
        """更新按钮状态"""
        if state == QMediaPlayer.PlayingState:
            self.播放按钮.setEnabled(False)
            self.暂停按钮.setEnabled(True)
        elif state == QMediaPlayer.PausedState:
            self.播放按钮.setEnabled(True)
            self.暂停按钮.setEnabled(False)
        else:
            self.播放按钮.setEnabled(True)
            self.暂停按钮.setEnabled(False)
    
    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
    
    def dropEvent(self, event):
        for url in event.mimeData().urls():
            文件路径 = url.toLocalFile()
            if 文件路径.lower().endswith(('.mp3', '.wav', '.ogg')):
                # 移动文件到资源目录
                文件名 = os.path.basename(文件路径)
                新路径 = os.path.join("resources", 文件名)
                try:
                    import shutil
                    shutil.move(文件路径, 新路径)
                    self.歌曲列表.addItem(文件名)
                except Exception as e:
                    print(f"文件移动失败: {e}")
    
    def 应用皮肤(self, index):
        主题名称 = self.皮肤选择.itemText(index)
        style_sheet = self.皮肤样式.get(主题名称, '')
        self.setStyleSheet(style_sheet)

    def 初始化界面(self):
        """初始化主窗口界面"""
        # 创建菜单栏
        menu_bar = QMenuBar(self)
        self.setMenuBar(menu_bar)
        
        # 文件菜单
        文件菜单 = menu_bar.addMenu('文件')
        退出动作 = QAction('退出', self)
        退出动作.triggered.connect(self.close)
        文件菜单.addAction(退出动作)
        
        # 功能菜单
        功能菜单 = menu_bar.addMenu('功能')
        
        # 添加语音控制选项
        语音控制动作 = QAction('启动语音助手', self)
        语音控制动作.triggered.connect(self.启动语音助手)
        功能菜单.addAction(语音控制动作)
        
        # 添加家长控制选项
        家长控制动作 = QAction('家长控制设置', self)
        家长控制动作.triggered.connect(self.打开家长控制)
        功能菜单.addAction(家长控制动作)
        
        # 家庭共享菜单
        家庭菜单 = menu_bar.addMenu('家庭')
        
        家庭登录动作 = QAction('家庭成员登录', self)
        家庭登录动作.triggered.connect(self.执行家庭登录)
        家庭菜单.addAction(家庭登录动作)
        
        家庭设置动作 = QAction('家庭管理设置', self)
        家庭设置动作.triggered.connect(self.打开家庭设置)
        家庭菜单.addAction(家庭设置动作)
        
        # 皮肤菜单
        皮肤菜单 = menu_bar.addMenu('外观')
        
        默认皮肤动作 = QAction('默认皮肤', self)
        默认皮肤动作.triggered.connect(lambda: self.应用皮肤('默认'))
        皮肤菜单.addAction(默认皮肤动作)
        
        深色皮肤动作 = QAction('深色主题', self)
        深色皮肤动作.triggered.connect(lambda: self.应用皮肤('深色主题'))
        皮肤菜单.addAction(深色皮肤动作)
        
        粉色皮肤动作 = QAction('粉色系', self)
        粉色皮肤动作.triggered.connect(lambda: self.应用皮肤('粉色系'))
        皮肤菜单.addAction(粉色皮肤动作)

    def 加载用户配置(self):
        """加载用户偏好设置"""
        # 加载上次使用的皮肤
        最后使用的皮肤 = self.配置.get('界面设置', '当前皮肤', fallback='默认')
        self.应用皮肤(最后使用的皮肤)
        
        # 加载播放模式
        播放模式 = int(self.配置.get('播放设置', '播放模式', fallback='0'))
        self.控制面板.设置_playback_mode(播放模式)
        
        # 加载音量设置
        音量 = int(self.配置.get('音频设置', '音量', fallback='50'))
        self.播放器.setVolume(音量)
        self.控制面板.set_volume(音量)
        
        # 加载语言设置
        语言 = self.配置.get('语言设置', '当前语言', fallback='zh')
        self.切换语言(语言)

    def 启动语音助手(self):
        """启动语音助手服务"""
        if not self.语音助手.is_running():
            self.语音助手.start()
            print("语音助手已启动")
            
        # 显示语音交互界面
        self.显示语音界面()
    
    def 停止语音助手(self):
        """停止语音助手服务"""
        if self.语音助手.is_running():
            self.语音助手.stop()
            print("语音助手已停止")
    
    def 显示语音界面(self):
        """显示语音交互可视化界面"""
        # 实现语音波形显示、状态提示等
        pass
    
    def 执行家庭登录(self):
        """执行家庭成员登录操作"""
        if self.家庭管理.登录('家长', 'password123'):
            print("家庭登录成功")
            self.播放器.家长控制.设置会话时间(3600)  # 家长登录后延长会话时间
            
    def 打开家庭设置(self):
        """打开家庭管理设置界面"""
        self.家庭管理.show_settings()
    
    def 打开家长控制(self):
        """打开家长控制设置界面"""
        self.播放器.家长控制.show_settings()
    
    def 切换语言(self, lang_code):
        """切换应用程序语言"""
        try:
            # 加载对应语言的翻译文件
            if lang_code == 'en':
                trans = gettext.NullTranslations()
            else:
                trans = gettext.NullTranslations()
                
            trans.install()
            global _
            _ = trans.gettext
            
            # 更新界面文本
            self.retranslateUi()
            print(f'成功切换到{lang_code}语言')
        except Exception as e:
            print(f'语言切换失败: {e}')
    
    def retranslateUi(self):
        """重新翻译界面元素"""
        self.setWindowTitle(_('儿歌播放器'))
        
        # 更新菜单栏
        menu_bar = self.menuBar()
        if menu_bar:
            for menu in menu_bar.findChildren(QMenu):
                if menu.title() == '文件':
                    menu.setTitle(_('文件'))
                elif menu.title() == '功能':
                    menu.setTitle(_('功能'))
                elif menu.title() == '家庭':
                    menu.setTitle(_('家庭'))
                elif menu.title() == '外观':
                    menu.setTitle(_('外观'))
                    
        # 更新控制面板文本
        self.控制面板.retranslateUi()
        
    def closeEvent(self, event):
        """窗口关闭时保存当前设置"""
        # 保存当前皮肤设置
        self.配置.set('界面设置', '当前皮肤', self.当前皮肤)
        
        # 保存播放模式设置
        self.配置.set('播放设置', '播放模式', str(self.控制面板.get_playback_mode()))
        
        # 保存音量设置
        self.配置.set('音频设置', '音量', str(self.播放器.volume()))
        
        # 保存语言设置
        self.配置.set('语言设置', '当前语言', self.当前语言)
        
        # 停止语音助手
        if hasattr(self, '语音助手') and self.语音助手.is_running():
            self.语音助手.stop()
            
        super().closeEvent(event)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = QQ儿歌播放器()
    player.show()
    sys.exit(app.exec_())